//package com.example.demolearn.Interceptor;
//
//import com.example.demolearn.aspect.HttpLog;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.web.method.HandlerMethod;
//
//import javax.annotation.Resource;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.lang.reflect.Method;
//import java.util.HashMap;
//import java.util.Iterator;
//import java.util.Map;
//
//
///**
// * API访问日志拦截器，只会记录API调用日志
// * @author xf107431
// *
// */
//@Slf4j
//@Configuration
//public class ApiAccessLogInterceptor extends BaseInterceptor {
//
//    @Resource
//    private ObjectMapper objectMapper;
//
//
//    @Override
//    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//
//        //1.如果类上，或方法上标记了ApiAccessLogIdentity注解，表示要记录日志
//        HandlerMethod handlerMethod = (HandlerMethod) handler;
//        //目标方法
//        Method method = handlerMethod.getMethod();
//        //目标类型
//        Class<?> clazz = handlerMethod.getBeanType();
//        //资源编号
//        String resourceCode = null;
//        HttpLog apiAccessLogIdentity = null;
//        //如果方法上有标ApiAccessLogIdentity注解，获得标注的值
//        if (method.isAnnotationPresent(HttpLog.class)) {
//            apiAccessLogIdentity = method.getAnnotation(HttpLog.class);
//            //方法标识的ApiAccessLogIdentity的value
//            resourceCode = apiAccessLogIdentity.value();
//        }
//        //如果标记为空
//        if ("".equals(resourceCode) && resourceCode != null) {
//            //获得类上标记的resourceCode
//            String beanApiIdentity = getValueByClazzApiAccessLogIdentity(clazz, HttpLog.class);
//            if ("".equals(beanApiIdentity) && beanApiIdentity != null) {
//                return;
//            }
//            //把方法名转换成大写，加底杠
//            String upperCaseMethodName = method.getName();
//            resourceCode = beanApiIdentity + "_" + upperCaseMethodName;
//        }
//
//        //获取requestBody中的数据
//        //InputStream is = request.getInputStream();
//        //String requestBody = StreamUtils.copyToString(is, Charset.forName("UTF-8"));
//        //log.debug("requestBody:" + requestBody);
//        //请求类型
//        String requestType = request.getMethod();
//        //获取requestParam中的数据
//        Map<String, String[]> parameterMap = request.getParameterMap();
//
//        Map<String, String> params = new HashMap<String, String>();
//        for (Iterator iter = parameterMap.keySet().iterator(); iter.hasNext(); ) {
//            String name = (String) iter.next();
//            String[] values = parameterMap.get(name);
//            String valueStr = "";
//            for (int i = 0; i < values.length; i++) {
//                valueStr = (i == values.length - 1) ? valueStr + values[i]
//                        : valueStr + values[i] + ",";
//            }
//            //乱码解决，这段代码在出现乱码时使用。
//            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
//            params.put(name, valueStr);
//        }
//        String requestParam = objectMapper.writeValueAsString(params);
//        //响应数据主体
//        String responseBody = null;
//
//        int code = 200;
//        String exceptionInfo = null;
//        if (ex != null) {
//            code = 500;
//            exceptionInfo = ex.getMessage();
//        }
//        //客户端代理信息
//        String userAgent = request.getHeader("User-Agent");
//        //浏览器名
//        //访问时间
//        long accessTime = System.currentTimeMillis();
//
//        //服务器地址
//        String serverAddr = request.getServerName() + ":" + request.getServerPort();
//        //客户端ip地址
//        String remoteAddr = request.getRemoteHost() + ":" + request.getRemotePort();
//
//
//        log.debug("requestParam: " + serverAddr);
//        log.debug("remoteAddr: " + remoteAddr);
//        log.debug("responseBody: " + responseBody);
//        log.debug("exceptionInfo: " + exceptionInfo);
//        log.debug("requestParam: " + requestParam);
//        log.debug("code: " + code);
//        System.out.println("accessTime: " + accessTime);
//        log.debug("userAgent: " + userAgent);
//    }
//}
